home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 2
/
Amiga Tools 2.iso
/
tools
/
packer
/
xpkarchive
/
examples
/
xarc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-09
|
5KB
|
153 lines
#include <stdlib.h>
#include <libraries/xpkarchive.h>
struct Library *XpkArchiveBase;
#define BUFSIZE 4096L
char buffer[BUFSIZE];
int chkabort(void) { return 0; } /* disable SAS ^C handling */
long __asm chunkfunc(register __a1 struct XpkProgress *prog);
struct Hook chunkhook = {{0},chunkfunc};
main(argc,argv)
int argc;
char *argv[];
{
ULONG Error;
XarHandle *arc;
short a;
short uncompress=0;
short list=0;
int base=1;
char *mode="NUKE";
if(argc<3) {
printf("Usage: %s [-m|-x|-l] <archive> <file1> [<file2> ...]\n",argv[0]);
exit(0);
}
if(!strcmp("-m",argv[1])) {
mode=argv[2];
base=3;
} else if(!strcmp("-l",argv[1])) {
list=1;
base=2;
} else if(!strcmp("-x",argv[1])) {
uncompress=1;
base=2;
}
if(!(XpkArchiveBase=OpenLibrary("xpkarchive.library",0L))) {
fprintf(stderr,"Cannot open xpkarchive.library\n");
exit(0);
}
if(!(arc=XarOpenArchive(XAR_ArchiveName,argv[base],
XAR_ArchiveMode,XAR_ModeAppend,
XAR_Error,&Error,
TAG_DONE))) {
printf("Fatal Error: %ld\n",Error);
CloseLibrary(XpkArchiveBase);
exit(0);
}
printf("Returncode: %ld\n",Error);
if(list) {
ULONG sum1=0,sum2=0;
float ratio;
XarLock *lock;
struct FileData *data;
puts("Original Packed Ratio Date Time Gen Mode Name\n"
"-------- ------ ---- -------- -------- --- ---- ----------");
for(lock=XarGetLock(arc);lock;lock=XarNextLock(lock)) {
ULONG compsize;
data=XarGetFileData(lock);
compsize=XarGetFileSize(lock);
sum1+=data->Filesize;
sum2+=compsize;
if(data->Filesize==0) ratio=0; else ratio=100.0-100*(float)compsize/data->Filesize;
if(XarIsXpkArchive(arc)) {
ULONG pname[2];
struct XpkFib fib;
XarExamine(lock,&fib);
pname[0]=fib.ID;
pname[1]=0;
printf("%8lu %6lu %2.1f %2d.%02d.%02d %2d:%02d:%02d %3d %4s %s\n",
data->Filesize,compsize,ratio,data->Time.Day,data->Time.Month,
data->Time.Year,data->Time.Hour,data->Time.Min,data->Time.Sec,
data->Generation+1,pname,XarGetFileName(lock));
} else {
printf("%8lu %6lu %2.1f %2d.%02d.%02d %2d:%02d:%02d %3d %4d %s\n",
data->Filesize,compsize,ratio,data->Time.Day,data->Time.Month,
data->Time.Year,data->Time.Hour,data->Time.Min,data->Time.Sec,
data->Generation+1,data->Method,XarGetFileName(lock));
}
if(XarGetFileNote(lock)) puts(XarGetFileNote(lock));
}
puts("-------- ------ ----");
if(sum1==0) ratio=0; else ratio=100.0-100*(float)sum2/sum1;
printf("%8lu %6lu %2.1f\n",sum1,sum2,ratio);
} else if(uncompress) {
for(a=base+1;a<argc;a++) {
char tmp[100],*p;
int gen=0;
strcpy(tmp,argv[a]);
if(p=rindex(tmp,',')) {
if(sscanf(p+1,"%d",&gen)!=1) {
fprintf(stderr,"Invalid generation\n");
goto ExitFail;
}
*p=0;
gen--;
}
printf("Generation %d\n",gen+1);
XarExtractFile(XAR_OutName,argv[a],XAR_FileName,tmp,
XAR_Generation,(ULONG)gen,
XAR_Archive,arc,XAR_Error,&Error,
TAG_DONE);
printf("Error: %ld\n",Error);
}
} else {
for(a=base+1;a<argc;a++) {
char *basename,*p;
p=index(argv[a],':');
basename=p?p+1:argv[a]; /* Name without volume name */
if(*basename=='/') basename++;
XarAddFile(XPK_InName,argv[a],XAR_FileName,basename,
XAR_Archive,arc,XAR_Error,&Error,
XPK_PackMethod,mode,
XPK_ChunkHook,&chunkhook,TAG_DONE);
printf("Error: %ld\n",Error);
}
}
ExitFail:
XarCloseArchive(arc);
CloseLibrary(XpkArchiveBase);
}
long __asm chunkfunc(register __a1 struct XpkProgress *prog)
{
if( prog->Type!=XPKPROG_END ) {
printf("%4s: %-8s (%3ld%% done, %2ld%% CF, %6ld cps) %s\033[K\r",
prog->PackerName, prog->Activity, prog->Done,
prog->CF, prog->Speed, prog->FileName);
fflush(stdout);
} else {
printf("%4s: %-8s (%3ldK, %2ld%% CF, %6ld cps) %s\033[K\n",
prog->PackerName, prog->Activity, prog->ULen/1024,
prog->CF, prog->Speed, prog->FileName);
}
return (long)SetSignal(0, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C;
}